package repository

import (
	"blog/internal/model"
	"context"
	"errors"
	"gorm.io/gorm"
	"time"
)

type TagRepository interface {
	GetTag(ctx context.Context, id int64) (*model.Tag, error)
	CreateTag(ctx context.Context, tag *model.Tag) error
	GetTagByID(ctx context.Context, id uint) (*model.Tag, error)
	DeleteTagByID(ctx context.Context, id uint) error
	ListTags(ctx context.Context) ([]*model.Tag, error)
	GetTagsByIDs(ctx context.Context, ids []uint) ([]*model.Tag, error)
	Update(ctx context.Context, tag *model.Tag) error
}

func NewTagRepository(
	repository *Repository,
) TagRepository {
	return &tagRepository{
		Repository: repository,
	}
}

type tagRepository struct {
	*Repository
}

func (r *tagRepository) GetTagsByIDs(ctx context.Context, ids []uint) ([]*model.Tag, error) {
	var tags []*model.Tag
	if err := r.db.WithContext(ctx).Where("id IN ?", ids).Find(&tags).Error; err != nil {
		return nil, err
	}
	return tags, nil
}
func (r *tagRepository) GetTag(ctx context.Context, id int64) (*model.Tag, error) {
	var tag model.Tag

	return &tag, nil
}

func (r *tagRepository) CreateTag(ctx context.Context, tag *model.Tag) error {
	return r.DB(ctx).Create(tag).Error
}

func (r *tagRepository) GetTagByID(ctx context.Context, id uint) (*model.Tag, error) {
	var tag model.Tag
	if err := r.DB(ctx).First(&tag, id).Error; err != nil {
		if errors.Is(err, gorm.ErrRecordNotFound) {
			return nil, nil
		}
		return nil, err
	}
	return &tag, nil
}

func (r *tagRepository) DeleteTagByID(ctx context.Context, id uint) error {
	return r.DB(ctx).Delete(&model.Tag{}, id).Error
}

func (r *tagRepository) ListTags(ctx context.Context) ([]*model.Tag, error) {
	var tags []*model.Tag
	if err := r.DB(ctx).Find(&tags).Error; err != nil {
		return nil, err
	}
	return tags, nil
}
func (r *tagRepository) Update(ctx context.Context, tag *model.Tag) error {
	return r.DB(ctx).
		Model(&model.Tag{}).
		Where("id = ?", tag.ID).
		Updates(map[string]interface{}{
			"tag_name":  tag.Name,
			"update_at": time.Now(),
		}).Error
}
